
package platform.common.service.impl;

import java.util.Stack;

import org.apache.log4j.Logger;

import platform.common.bo.AbstractNestedSetTreeNode;
import platform.common.bo.InvalidTreeListDataException;
import platform.common.exception.BusinessException;
import platform.common.service.ILRTreeImportService;


import platform.common.service.impl.BaseBizServiceImpl;
import platform.common.service.impl.BaseLRTreeImportServiceImpl;

public abstract class BaseLRTreeImportServiceImpl extends BaseBizServiceImpl implements ILRTreeImportService  {
	/**
	 * 表示是兄弟节点。
	 */
	public final static int NODE_BROTHER=1;
	/**
	 * 表示父节点。
	 */
    public final static int NODE_PARENT=2;
    /**
	 * 表示是子节点。
	 */
    public final static int NODE_CHILD=-1;
    /**
	 * 表示是不是兄弟、父节点、子节点的其他节点。
	 */
    public final static int NODE_NORELATION=0;
    
    public String pathName = "";
    
    public static String err = "";

    /**
	 * log4j进行日志记录。
	 */
	private Logger log = Logger.getLogger(BaseLRTreeImportServiceImpl.class);

	/**
     * 弹出栈顶数据数据并保存到数据库，直到栈顶数据是当前文件行数据的父节点。
     * @param nodeStack 栈
	 * @param leftValue 当前的左右值
	 * @param isolatedFlag 树节点的隔离标识
	 * @param treeNode 当前待导入的树节点
	 * @param startLevel 导入初始层次
	 * @throws BusinessException
     */
	protected int popNodeAndStoreUtilParent(Stack nodeStack,int leftValue,String isolatedFlag,AbstractNestedSetTreeNode treeNode,int startLevel)throws BusinessException{
		try {
			AbstractNestedSetTreeNode treeNodeInStackTop=null;

			boolean continuePop=true;
			while(continuePop){
				treeNodeInStackTop=(AbstractNestedSetTreeNode)nodeStack.pop();
				
				if(this.pathName.indexOf("||")>-1){
					pathName = pathName.substring(0, pathName.length()-treeNodeInStackTop.getName().length()-2);
				}else{
					pathName = "";
				}
				log.debug("从栈里弹出节点并保存到数据库："+treeNodeInStackTop.getCode());
				int nodeLevel=nodeStack.size();
				treeNodeInStackTop.setRightValue(leftValue);
				treeNodeInStackTop.setTreeLevel(nodeLevel+startLevel);
				treeNodeInStackTop.setIsolatedFlag(isolatedFlag);
				leftValue++;
				//保存到数据库
				treeNodeInStackTop.insertTreeNodeNotSetLR(domainProviderSet);
				if(nodeStack.empty()){
					continuePop=false;
					//修改原因：两个相对独立的几点是正确的,不能抛出异常
					//throw new InvalidTreeListDataException();
				}else{
					treeNodeInStackTop=(AbstractNestedSetTreeNode)nodeStack.peek();
					int nodeRelation=judgeNodeRelation(treeNode,treeNodeInStackTop);
					if(nodeRelation==NODE_CHILD){//遇到了父节点，不要弹出了
						continuePop=false;
					}else{
						continuePop=true;
					}
				}
			}
		} catch (Exception e) {
			throw  handleBusinessServiceException(e);
		}
		return leftValue;
	}

	/**
	 * 判断treeNodeCompared节点是treeNode节点的什么关系。
	 *
	 * @param treeNode 要判断关系的节点
	 * @param treeNodeCompared 要比较的节点
	 * @return 1：表示treeNodeCompared是treeNode的兄弟；2：表示treeNodeCompared是treeNode的父亲；-1：表示treeNodeCompared是treeNode的儿子；0：表示treeNodeCompared与treeNode的无关系；
	 * @throws InvalidTreeListDataException
	 */
	protected abstract int judgeNodeRelation(AbstractNestedSetTreeNode treeNode,AbstractNestedSetTreeNode treeNodeCompared)throws InvalidTreeListDataException;
}
